package com.bauer.base.proxy.interfaceproxy;


import java.io.File;
import java.io.FileOutputStream;
import sun.misc.ProxyGenerator;

public class MyMain {

    /**
     * jdk的动态代理是通过 继承Proxy类和实现接口来实现动态代理
     *
     *
     *
     * 代理类的默认的构造函数就是  传入InvocationHandler 的实现类
     * 实际的实现方法还是 调用  h.invoke方法
     *
     * 只有接口中的方法才可以实现  动态代理
     *
     * 自调情况 是不会再次触发动态代理的
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Subject subject = new MyProxyHandler(new RealSubject()).getProxy();
        subject.dosomethinInner();
        printJDKProxyClassByte();

    }

    /**
     * 可以将生成好的代理类字节码打印出来
     */
    public static void printJDKProxyClassByte() throws Exception {

        byte[] classFile = ProxyGenerator
                .generateProxyClass("$ProxyMyTest", new Class[]{Subject.class});

        MyMain.class.getResource("/").getPath();
        FileOutputStream fos = new FileOutputStream(
                new File( "example.class"));

        fos.write(classFile);
        fos.flush();
        fos.close();
    }
}

